package de.justphil.tcg.tcgserver;

import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.glassfish.grizzly.http.server.HttpServer;
import org.glassfish.grizzly.websockets.WebSocketAddOn;
import org.glassfish.grizzly.websockets.WebSocketApplication;
import org.glassfish.grizzly.websockets.WebSocketEngine;
import org.slf4j.Logger;

import de.justphil.tcg.tcgserver.commons.config.GameConfig;
import de.justphil.tcg.tcgserver.commons.domain.Card;
import de.justphil.tcg.tcgserver.commons.domain.collections.CardInstanceCollection;
import de.justphil.tcg.tcgserver.commons.grid.Grid;
import de.justphil.tcg.tcgserver.websockets.TCGApplication;
import de.justphil.tcg.tcgserver.websockets.WebSocketApplicationHolder;
import de.justphil.tcg.tcgserver.websockets.services.GameService;
import de.justphil.tcg.tcgserver.commons.i18n.I18n;
import de.justphil.tcg.tcgserver.dummy.mock.MockDataCreator;
import static de.justphil.tcg.tcgserver.commons.logging.TCGLogging.*;

public class TCGServer {
	private static final Logger status = statusLogger(TCGServer.class);

	/**
	 * @param args
	 */
	public static void main(String[] args) throws IOException {
		
		String docRoot = new java.io.File(".").getCanonicalPath() + "\\htdocs";
		
		status.debug("Document root (htdocs): {}", docRoot);
		
		final HttpServer server = HttpServer.createSimpleServer(docRoot, 8888);
		
		// Register the WebSockets add on with the HttpServer
        server.getListener("grizzly").registerAddOn(new WebSocketAddOn());

        // initialize websocket chat application
        //final WebSocketApplication chatApplication = new ChatApplication();
        final WebSocketApplication tcgApp = WebSocketApplicationHolder.getTCGApplication();

        // register the application
        WebSocketEngine.getEngine().register(tcgApp);
        
        
        //ServletHandler sa = new ServletHandler();
        //sa.addFilter(new HttpDigestAuthFilter(), "HttpDigestAuthFilter", new HashMap<String, String>());
        //sa.setServletInstance(new MyServlet());
        //sa.setServletPath("/myservlet");
        //server.getServerConfiguration().addHttpHandler(sa, "/myservlet");
		
        /*
		server.getServerConfiguration().addHttpHandler(
				new HttpHandler() {

					@Override
					public void service(Request req, Response res) throws Exception {
						String helloWorld = "Hello, World!";
						res.setContentType("text/plain");
						res.setContentLength(helloWorld.length());
						res.getWriter().write(helloWorld);
					}
					
				},
				"/helloworld"
		);
		*/
        
        /*
        Gson gson = new Gson();
        TCGConnectMessage msg = gson.fromJson("{\"gameId\":\"123\",\"subject\":\"game-connect\"}", TCGConnectMessage.class);
        
        if (msg.getSubject() == null) {
        	System.out.println("msg.getSubject() is null!");
        }
        else {
        	System.out.println("msg.getSubject() is NOT null!");
        }
        
        if (msg.getGameId() == null) {
        	System.out.println("msg.getGameId() is null!");
        }
        else {
        	System.out.println("msg.getGameId() is NOT null!");
        }
        
        if (msg.getPlayerId() == null) {
        	System.out.println("msg.getPlayerId() is null!");
        }
        else {
        	System.out.println("msg.getPlayerId() is NOT null!");
        }
        */
        
        /* ############################################################################################ */
		/* ############################################################################################ */
		/* ############################################################################################ */
        
        I18n.printSupportedLanguages();
        
        /* ############################################################################################ */
		/* ############################################################################################ */
		/* ############################################################################################ */
        
        Grid.initWebSocketServerGrid();
        
        /* ############################################################################################ */
		/* ############################################################################################ */
		/* ############################################################################################ */
        
        TCGApplication app = (TCGApplication) tcgApp;
        
        /* ############################################################################################ */
		/* ############################################################################################ */
		/* ############################################################################################ */
        
        int port			= de.justphil.tcg.tcgserver.commons.config.Config.WEBSOCKET_SERVER_TCGAME_CREATOR_PORT;
        int socketTimeout	= de.justphil.tcg.tcgserver.commons.config.Config.WEBSOCKET_SERVER_TCGAME_CREATOR_SOCKET_TIMEOUT;
        GameService gameService = new GameService(port, socketTimeout);
        gameService.setTCGameCreator( app );
        gameService.start();
        
        app.setGameService(gameService);
        
        /* ############################################################################################ */
		/* ############################################################################################ */
		/* ############################################################################################ */
        
        
        List<Long> players = new ArrayList<Long>(GameConfig.NUMBER_OF_PLAYERS_PER_GAME);
        
        long player1 = 1L;
        status.info("### playerId: {} ###", player1);
        players.add(player1);
        
        long player2 = 2L;
        status.info("### playerId: {} ###", player2);
        players.add(player2);
        
        MockDataCreator dataCreator = new MockDataCreator();
		CardInstanceCollection[] decks = {
				dataCreator.createMockDeck1(),
				dataCreator.createMockDeck2()
		};
		
		Map<Long, Card> cardMap = dataCreator.getInGameCards();
		
		Map<Long, Integer> playerToDeckMapping = new HashMap<Long, Integer>();
		playerToDeckMapping.put(player1, 0);
		playerToDeckMapping.put(player2, 1);
		
		String[] otps = new String[] { "123asd", "123asd" };
		
		Map<Long, Integer> playerToOtpMapping = new HashMap<Long, Integer>();
		playerToOtpMapping.put(player1, 0);
		playerToOtpMapping.put(player2, 1);
        
        long gameId = app.createNewGameLocally(players, decks, otps, playerToDeckMapping, playerToOtpMapping, cardMap, "test");
        status.info("### gameId: {} ###", gameId);
        
        
        app.printStatus();
        
        /* ############################################################################################ */
		/* ############################################################################################ */
		/* ############################################################################################ */
        
        server.start();
        System.out.println("Press any key to stop the server...");
        System.in.read();
        
        // stop the server
        server.stop();
        
        /*
		try {
			
		} catch (IOException ioe) {
			ioe.printStackTrace();
        } finally {
            
        }
        */
	}

}
